function addMember(value: any) {
  return function (target: any) {
     target.prototype[value] = value;
  }
}

function enumerable(value: any) {
  return function (target: any, key: any, descriptor: any) {
     descriptor.enumerable = value;
     return descriptor;
  }
}

@addMember('memberA')
class Person1 {
  first: string;
  last: string;
  
  constructor(first: any, last: string){
    this.first = first;
    this.last = last;
  }
  
  @enumerable(false)
  printName() { 
    console.log(`${this.first} ${this.last}`) 
  }
}

var person = new Person1("hu", "bing");
for (var key in person) {
  console.log(key);
}


// function f() {
//     console.log("f(): evaluated");
//     return function (target, propertyKey: string, descriptor: PropertyDescriptor) {
//         console.log("f(): called");
//     }
// }

// function g() {
//     console.log("g(): evaluated");
//     return function (target, propertyKey: string, descriptor: PropertyDescriptor) {
//         console.log("g(): called");
//     }
// }

// class Person {
//     constructor(){
//     }
    
//     @f()
//     @g()
//     method() {
//       console.log('Person method():called')
//     }
// }

// function f() {
//     console.log("f(): evaluated");
//     return function (target) {
//         console.log("f(): called");
//     }
// }

// function g() {
//     console.log("g(): evaluated");
//     return function (target) {
//         console.log("g(): called");
//     }
// }

// @f()
// @g()
// class Person {
//     constructor(){
//     }
    
//     method() {
//       console.log('Person method():called')
//     }
// }

// var per = new Person();
// per.method();